import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JSeparator;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Observable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JTextArea;
import java.awt.Color;
import javax.swing.JScrollPane;
import java.awt.Font;
import javax.swing.SwingConstants;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import java.awt.Component;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.Box;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.ScrollPaneConstants;
/**
 * Fenêtre de saisie d'un ouvrage 
 * Code du JFrame généré par Window Builder/Swing Designer.
 * @author IUT,  A.Culet 
 * @version 1.0
 */
public class VueSaisieParution extends Vue {

	private JPanel contentPane;
	private JTextField textFieldIssn ;
	private JTextField textFieldNumPar;
	private JTextField textFieldNom;
	private JTextField textFieldNbArticles;
	private JButton buttonCreer;
	private JButton buttonTerminer;
	private JComboBox comboBox;
	private JButton buttonAjouterAuteur;
	private JButton buttonAjouterMotCle;
	private JButton buttonAnnuler;
	private JButton buttonAnnul;
	private JButton buttonEnregArticle;
	private JTextField textFieldTitre;
	private JTextField textFieldNumPage;
	
	private Vector<String> vectThe;
	private HashSet<String> selectAut;
	private HashSet<String> selectMotCles;
	private String issn;
	private String numPar;
	private String numPage;
	private String titre;
	private JList list;
	private HashSet<Auteur> auteurs;
	private HashSet<MotCle> theme;
	
	// à ajouter car la vue est observatrice d'une parution
	private Parution _parution ;

	
	/**
	 * Create the frame.
	 */				
	public VueSaisieParution(Controleur controleur,HashSet<Auteur> Listauteurs, HashSet<MotCle> motCles) {
		super(controleur);
		auteurs=Listauteurs;
		setTitle("Enregistrement d'une nouvelle parution");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
		setBounds(100, 100, 450, 550);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Issn");
		lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNewLabel.setBounds(99, 32, 61, 15);
		contentPane.add(lblNewLabel);
		
		textFieldIssn = new JTextField();
		textFieldIssn.setBounds(170, 32, 141, 19);
		contentPane.add(textFieldIssn);
		textFieldIssn.setColumns(10);
		
		JLabel lblNewLabel_1 = new JLabel("Numero de parution");
		lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNewLabel_1.setBounds(35, 66, 125, 15);
		contentPane.add(lblNewLabel_1);
		
		textFieldNumPar = new JTextField();
		textFieldNumPar.setBounds(170, 65, 141, 19);
		contentPane.add(textFieldNumPar);
		textFieldNumPar.setColumns(10);
		
		buttonCreer = new JButton("Creer");
		buttonCreer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				 issn = textFieldIssn.getText();
				 numPar = textFieldNumPar.getText();
				setParution( getControleur().rechParution(issn, numPar) );
				if (getParution()!=null) {
					if (getParution()!=null) {
					getParution().addObserver(VueSaisieParution.this);
					textFieldNom.setText(getParution().getPeriodique().getNom());
					}
				}
		}});
		buttonCreer.setBounds(302, 96, 107, 25);
		contentPane.add(buttonCreer);
		
		buttonAnnul = new JButton("Annuler");
		buttonAnnul.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getControleur().fermerVue(VueSaisieParution.this);
			}
		});
		buttonAnnul.setBounds(170, 97, 89, 23);
		contentPane.add(buttonAnnul);
		
		JLabel lblNewLabel_2 = new JLabel("Periodique");
		lblNewLabel_2.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNewLabel_2.setBounds(189, 151, 92, 33);
		contentPane.add(lblNewLabel_2);
		
		textFieldNom = new JTextField();
		textFieldNom.setBounds(289, 158, 141, 19);
		contentPane.add(textFieldNom);
		textFieldNom.setColumns(10);
		
		JLabel lblEditeur = new JLabel("Nombres d'articles");
		lblEditeur.setHorizontalAlignment(SwingConstants.RIGHT);
		lblEditeur.setBounds(12, 160, 125, 15);
		contentPane.add(lblEditeur);
		
		textFieldNbArticles = new JTextField();
		textFieldNbArticles.setColumns(10);
		textFieldNbArticles.setBounds(151, 158, 27, 19);
		contentPane.add(textFieldNbArticles);
		

		
		JLabel lblAuteur = new JLabel("Auteur");
		lblAuteur.setBounds(35, 270, 61, 15);
		contentPane.add(lblAuteur);
		
		selectAut= new HashSet<String>();
		buttonAjouterAuteur = new JButton("Ajouter");
		buttonAjouterAuteur.setBounds(305, 265, 107, 25);
		buttonAjouterAuteur.addActionListener(new ActionListener() {
			//Creation de la liste de mot auteur	
			public void actionPerformed(ActionEvent e) {
				Object val;
				val=comboBox.getSelectedItem();
				Vector<String> nomPrenom = new Vector<String>();
				if(val!=null){
					boolean existe=false;
						for(String aut:selectAut){
							if(aut==val.toString()){
								existe=true;
							}
						}
						if(existe==true){
							Message dialog = new Message("Cet auteur a déjà été séléctionné ");
							dialog.setVisible(true);			
						}
						else{
							StringTokenizer parser = new StringTokenizer(val.toString());
							while (parser.hasMoreTokens())  {
								nomPrenom.add(parser.nextToken());
							}
							if(nomPrenom.size()==2){
								selectAut.add(val.toString());
							}
							else{
								Message dialog = new Message("Un auteur a un nom et un prenom ");
								dialog.setVisible(true);
							}
						}
				}
				}

			});
		contentPane.add(buttonAjouterAuteur);
		

		JLabel lblTheme = new JLabel("Theme");
		lblTheme.setBounds(35, 319, 61, 15);
		contentPane.add(lblTheme);
		
		selectMotCles= new HashSet<String>();
		buttonAjouterMotCle = new JButton("Ajouter");
		buttonAjouterMotCle.setBounds(305, 314, 107, 25);
		contentPane.add(buttonAjouterMotCle);
		//Creation de la liste de motCle
		buttonAjouterMotCle.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Object val;
				val=list.getSelectedValue();
				if(val!=null){
					boolean existe=false;
					for(String mc:selectMotCles){
						if(mc==val.toString()){
							existe=true;
						}
					}
					if(existe==false){
						selectMotCles.add(val.toString());
					}
					else{
						Message dialog = new Message("Ce theme a déjà été séléctionné ");
						dialog.setVisible(true);					
					}

				}
			}
		});
		
		buttonAnnuler = new JButton("Annuler");
		buttonAnnuler.setEnabled(false);
		buttonAnnuler.setBounds(99, 470, 107, 25);
		contentPane.add(buttonAnnuler);
		buttonAnnuler.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setEtat(Vue.initiale);
				
			}
		});
		
		buttonTerminer = new JButton("Terminer");
		buttonTerminer.setBounds(246, 470, 107, 25);
		buttonTerminer.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
	
				getControleur().fermerVue(VueSaisieParution.this);
			}
		});
		contentPane.add(buttonTerminer);
		
		JSeparator separator = new JSeparator();
		separator.setBounds(85, 132, 300, 2);
		contentPane.add(separator);
		
		textFieldTitre = new JTextField();
		textFieldTitre.setColumns(10);
		textFieldTitre.setBounds(99, 196, 141, 19);
		contentPane.add(textFieldTitre);
		
		JLabel lblTitre = new JLabel("Titre");
		lblTitre.setHorizontalAlignment(SwingConstants.RIGHT);
		lblTitre.setBounds(12, 197, 68, 17);
		contentPane.add(lblTitre);
		
		comboBox = new JComboBox();
		comboBox.setBounds(102, 265, 182, 24);
		contentPane.add(comboBox);

		
		textFieldNumPage = new JTextField();
		textFieldNumPage.setColumns(10);
		textFieldNumPage.setBounds(99, 222, 141, 19);
		contentPane.add(textFieldNumPage);
		
		JLabel lblPage = new JLabel("Page");
		lblPage.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPage.setBounds(12, 223, 68, 17);
		contentPane.add(lblPage);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setBounds(99, 314, 182, 72);
		contentPane.add(scrollPane);
		
	    String chainemc;
	    vectThe=new Vector<String>();
	    //remplissage de la liste
	    if(motCles!=null){
		for(MotCle mc:motCles){
			chainemc=mc.getMotCle();
			vectThe.addElement(chainemc);
		}
	    }
		
		list = new JList(vectThe);
		scrollPane.setViewportView(list);
		
		JSeparator separator_1 = new JSeparator();
		separator_1.setBounds(69, 456, 300, 2);
		contentPane.add(separator_1);
		
		buttonEnregArticle = new JButton("Enregistrer article");
		buttonEnregArticle.setBounds(246, 407, 163, 25);
		contentPane.add(buttonEnregArticle);
		
		JLabel lblZoneDentreDarticle = new JLabel("Zone d'entr\u00E9e d'article :");
		lblZoneDentreDarticle.setBounds(12, 135, 166, 14);
		contentPane.add(lblZoneDentreDarticle);

		buttonEnregArticle.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				titre= textFieldTitre.getText();
				numPage = textFieldNumPage.getText();
				Article article = getControleur().nouvArticle(_parution, titre, numPage, selectAut, selectMotCles);
				if (article!=null) getParution().addArticle(article);
				
				textFieldTitre.setText("");
				textFieldNumPage.setText("");
				selectAut.clear();
				selectMotCles.clear();
				
			}
		});
	}
	
	private Parution getParution() {
		return _parution;
	}
	private void setParution(Parution parution) {
		 _parution = parution;
	}
	/**
	 * alimentation des composants d'affichage en consultant directement l'ouvrage
	 */
	public void alimente(Parution par) {
		textFieldNbArticles.setText(String.valueOf(par.getNbArticles()));
		String chaine;		
		//Remplissage de la comboBox
		if(auteurs!=null){
		for(Auteur a:auteurs ){
			
			chaine=a.getNom()+a.getPrenom();
			comboBox.addItem(chaine);
		}
		}

	}
	public void setEtat (int etat){
		switch (etat) {
		case initiale: {
			buttonCreer.setEnabled(true);
			buttonTerminer.setEnabled(false);
			buttonAjouterAuteur.setEnabled(false);
			buttonAjouterMotCle.setEnabled(false);
			buttonEnregArticle.setEnabled(false);
			buttonAnnuler.setEnabled(false);
			buttonAnnul.setEnabled(true);
			textFieldIssn.setEditable(true);
			textFieldNumPar.setEditable(true);
			textFieldNom.setEditable(false);
			textFieldNbArticles.setEditable(false);
			comboBox.setEnabled(false);
			comboBox.setEditable(false);
			textFieldTitre.setEditable(false);
			textFieldNumPage.setEditable(false);
			break;
			}
		case finale: {
			buttonCreer.setEnabled(false);
			buttonTerminer.setEnabled(true);
			buttonAjouterAuteur.setEnabled(true);
			buttonAjouterMotCle.setEnabled(true);
			buttonEnregArticle.setEnabled(true);
			buttonAnnuler.setEnabled(true);
			buttonAnnul.setEnabled(false);
			textFieldIssn.setEditable(false);
			textFieldNumPar.setEditable(false);
			textFieldNom.setEditable(false);
			textFieldNbArticles.setEditable(false);
			comboBox.setEnabled(true);
			comboBox.setEditable(true);
			textFieldTitre.setEditable(true);
			textFieldNumPage.setEditable(true);
			break;
		}
		}
	}
		/**
		 * méthode exécutée automatiquement lorsque l'ouvrage observé notifie un changement
		 */
		public void update(Observable observable, Object objet) {
			// maj de la vue lorque l'ouvrage a été modifié
			System.out.println("Passage dans update!!!!");
			this.alimente(this.getParution());
			super.update(observable,  objet);
		} // Fin upDate	
}
